﻿using System;
using System.Xml;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Microsoft.Ink;

namespace Modele
{
    class writer1
    {
        //à changer paramètre, prend normalement l'url, voir pour récupérer le projet
        static void ecrireUPX(ProjetBlocNote proj)
        {

            // Create a new file
            //TODO mettre le bon nom de fichier et le bon repertoire (voir au niveau de l'archive)

            XmlTextWriter textWriter = new XmlTextWriter("C:/Documents and Settings/evy/Mes documents/INSA/4ème année/projet/implemtation thomas 03 03/Implementation/WindowsApplication1/WindowsApplication1/sauvegarde.upx", null);

            // Opens the document

            textWriter.WriteStartDocument();

            // Write comments

            textWriter.WriteComment("Document XML de sauvegarde de projet PAN au format UPX");

            //TODO commentaire à modifier avec le bon nom de fichier
            textWriter.WriteComment("fichierXmResultat.xml in root dir");


            //nombre de pages (peu pertinent maintenant vu que pas de PDF)
            textWriter.WriteStartElement("nbPages");
            textWriter.WriteAttributeString("nb", "" + proj.getNbrPage());
            textWriter.WriteEndElement();

            IEnumerator e = proj.getBlocCourant().GetEnumerator();
            while (e.MoveNext())
            {
                Couche couche1 = (Couche)e.Current;

                    int i = 0;
                    int j = 0;
                    int k = 0;

                    foreach (Calque calque1 in couche1.getCouche())
                    {

                        textWriter.WriteStartElement("visibiliteCouche");
                        textWriter.WriteAttributeString("idcouche", "" + i);
                        if (couche1.estVisible())
                        {
                            textWriter.WriteAttributeString("visible", "oui");
                        }
                        else
                        {
                            textWriter.WriteAttributeString("visible", "non");
                        }
                        i++;

                        /*
                        //niveau page
                        if ((obj.GetType()).Equals(Page))
                        {
                            textWriter.WriteStartElement("hlevel");
                            textWriter.WriteAttributeString("level", "page");
                            textWriter.WriteAttributeString("id", "page" + i);
                            i++;
                            }*/

                        //niveau calque

                        textWriter.WriteStartElement("hlevel");
                        textWriter.WriteAttributeString("level", "calque");
                        textWriter.WriteAttributeString("idcalque", "" + j);

                        j++;


                        int m = 0;
                        int n = 0;
                        int o = 0;


                        CustomStrokes.CustomStrokesEnumerator en = calque1.encre.CustomStrokes.GetEnumerator();
                        while (en.MoveNext())
                        {
                            //TODO voir pour relier à l'encre (inkml/traceview)

                            Type t = en.Current.GetType();
                            //Forme p = new Forme();
                            //attention ptite bidouille pour que sa compile c'est pas t.gettype() mais p.gettype() !!!
                            if (t.GetElementType() == t.GetType())
                            {

                                //formes

                                textWriter.WriteStartElement("hlevel");
                                textWriter.WriteAttributeString("level", "forme");
                                textWriter.WriteAttributeString("idforme", "" + m);
                                //TODO récupérer sémantique




                               ////////////////// a corriger
                                textWriter.WriteStartElement("hwTraces");
                                textWriter.WriteStartElement("inkml", "traceView", "http://www.w3.org/2003/InkML");
                                textWriter.WriteAttributeString("traceRef", "Sauvegarde.inkml");
                                textWriter.WriteAttributeString("from", "12");
                                textWriter.WriteAttributeString("to", "12");

                                textWriter.WriteEndElement();
                                textWriter.WriteEndElement();
                                ///////////////////////

                                textWriter.WriteEndElement();

                                m++;
                            }
                            else
                            {
                                //niveau annotation
                                //TODO à finir

                                textWriter.WriteStartElement("hlevel");
                                textWriter.WriteAttributeString("level", "annotation");
                                textWriter.WriteAttributeString("idannotation", "" + k);



                                textWriter.WriteEndElement();
                            }
                        }

                        IDictionaryEnumerator an = calque1.annotations_map.GetEnumerator();
                        while (an.MoveNext())
                        {
                            AnnotationPAN anno = (AnnotationPAN)an.Current;

                            //TODO voir pour l'image bitmap
                            //Balises

                            Type d = an.Current.GetType();
                            Balise b = new Balise();
                            if (d.GetElementType() == b.GetType())
                            {
                                textWriter.WriteStartElement("hlevel");
                                textWriter.WriteAttributeString("level", "balise");
                                textWriter.WriteAttributeString("idbalise", "" + n);
                                textWriter.WriteEndElement();
                                
                                //position
                                textWriter.WriteStartElement("position");
                                textWriter.WriteAttributeString("positionX", "" + anno.getPosition().getPosX());
                                textWriter.WriteAttributeString("positionY", "" + anno.getPosition().getPosY());
                                textWriter.WriteEndElement();

                                //sémantique
                                textWriter.WriteStartElement("label");
                                textWriter.WriteStartElement("alternate");
                                String sann = anno.getSemantique().getSignification();
                                textWriter.WriteString("" + sann);
                                textWriter.WriteEndElement();
                                textWriter.WriteEndElement();
                                n++;
                            }
                            else
                            {
                                Texte tx = new Texte();
                                if (d.GetElementType() == tx.GetType())
                                {

                                    //texte

                                    textWriter.WriteStartElement("hlevel");
                                    textWriter.WriteAttributeString("level", "texte");
                                    textWriter.WriteAttributeString("idtexte", "" + o);

                                    //position
                                    textWriter.WriteStartElement("position");
                                    textWriter.WriteAttributeString("positionX", "" + anno.getPosition().getPosX());
                                    textWriter.WriteAttributeString("positionY", "" + anno.getPosition().getPosY());
                                    textWriter.WriteEndElement();
                                    
                                    //TODO récupérer l'attribut texte dans l'élément
                                    /*
                                    //texte
                                    textWriter.WriteStartElement("texte");
                                    textWriter.WriteAttributeString("texte",????);
                                    textWriter.WriteEndElement();
                                    */

                                    //sémantique
                                    textWriter.WriteStartElement("label");
                                    textWriter.WriteStartElement("alternate");
                                    String sann = anno.getSemantique().getSignification();
                                    textWriter.WriteString("" + sann);
                                    textWriter.WriteEndElement();
                                    textWriter.WriteEndElement();

                                    o++;
                                }
                            }

                            textWriter.WriteEndElement();
                            textWriter.WriteEndElement();
                            textWriter.WriteEndElement();
                            textWriter.WriteEndElement();
                            textWriter.WriteEndElement();

                            // Write one more element


                            textWriter.Close();

                        }

                    }
            }
        }
    }
}